package com.apache.common.plugins;

import com.apache.api.vo.ResultEntity;
import com.apache.cache.util.Validator;
import com.apache.client.UctProtoclClient;
import com.apache.exception.BusinessException;
import com.apache.ius.plugin.CustomMethodPlugin;
import com.apache.tools.StrUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @Classname AutoCodePluginImpl
 * @Description 自动生成获取编号
 * @Date 2020/6/10 17:40
 * @Created by fpc
 */
public class AutoCodePluginImpl implements CustomMethodPlugin {
    private Logger log = LoggerFactory.getLogger(getClass());
    @Override
    public Object beforeInvoke(Map<String, Object> map) {
        String autoColum = String.valueOf(map.get("autoColum"));
        if(StrUtil.isNull(autoColum)){
            throw new BusinessException("参数【autoColum】不能为空");
        }
        String seqEname = StrUtil.doNull(String.valueOf(map.get("seqEname")), "ROLE");				//1、定义序列标识：结合您的业务情况，定义英文的标识。
        String mode = StrUtil.doNull(String.valueOf(map.get("mode")), "0");		//生成模式
        String strLen = StrUtil.doNull(String.valueOf(map.get("strLen")), "4");		//定义序号编号总长度
        if(!isPureDigital(mode)&&!"1".equals(mode)&&"0".equals(mode)){
            mode="0";
        }
        if(!isPureDigital(strLen)){
            strLen="4";
        }
        String code = "";
        /**
         *2、调用序号服务端，getSeqNextValue方法参数解释如下：
         *String seqEname：英文序列号标识，int strLen：定义序号编号总长度，不足位自动补齐0
         *int mode：生成模式（0时返回格式如USER0002不带日期，1时返回格式如USER201806110002带日期））
         *         （具体用0/1，请结合实际情况）
         */
        ResultEntity entitySeq = UctProtoclClient.getInstance().getSeqNextValue(seqEname,Integer.parseInt(strLen),Integer.parseInt(mode));

        if ("true".equals(entitySeq.getResult()) && !Validator.isEmpty(entitySeq.getEntity())){
            code = String.valueOf(entitySeq.getEntity());
        }

        map.put(autoColum,code);	//5、通过param.put把新生成的编号放到对应表的对应字段中，以备存储
        log.info("自动生成编号："+code);
        map.remove("autoColum");
        map.remove("seqEname");
        map.remove("mode");
        map.remove("strLen");
        return null;
    }

    @Override
    public Object doInvoke(Map<String, Object> map) {
        return null;
    }

    @Override
    public Object afterInvoke(Map<String, Object> map) {
        return null;
    }
    private  boolean isPureDigital(String str) {
        if (str == null || "".equals(str)){
            return false;
        }
        String regEx1 = "^[1-9]\\d*$";
        Pattern p;
        Matcher m;
        p = Pattern.compile(regEx1);
        m = p.matcher(str);
        if (m.matches()){
            return true;
        }else{
            return false;
        }
    }
}
